#ifndef MEMORY_POOL
#define MEMORY_POOL

#include <cstddef>  // 引入size_t类型定义
#include <cstdlib>  // 引入malloc、free等内存管理函数
#include <iostream> // 引入输入输出流
#include <cstring>  //引入memcpy等内存操作

#define ALIGN 8
#define MAX_BYTES 128
#define FREE_LIST 16

namespace sgi_memo_pool{

class MemoryPool{
private:
    union Obj{
        union Obj* free_list_link;
        char client_data[1];
    };
      
    static Obj* volatile free_list[FREE_LIST];
    
    static char* start_free;
    static char* end_free;
    static size_t heap_size;

    static size_t round_up(size_t bytes){
        return ((bytes+ALIGN-1) & ~(ALIGN-1));
    }

    static size_t freelist_index(size_t bytes){
        //为啥(bytes)/(ALIGN)不用 这个会出现8/8=1
        return ((bytes+ALIGN-1)/ ALIGN-1);  //向上取整对齐 
    }
    
    static void* refill(size_t n);

    static char* chunk_alloc(size_t size,int& nobjs);

public:
    static void* allocate(size_t n);
    static void  deallocate(void* p,size_t n);
    static void* reallocate(void* p,size_t old_sz,size_t new_sz);
    
};
    

}

#endif